/*
 * ArchivoIndice.h
 *
 *  Created on: 04/06/2013
 *      Author: jonathan
 */

#ifndef ARCHIVOINDICE_H_
#define ARCHIVOINDICE_H_
#include "../../typedefs.hpp"
#include "../../general/estructuras/Termino.h"
#include "../../commons/bitstream.h"
#include "../estructuras/EntradaIndice.h"
#include "../estructuras/Cabecera.h"
#include "ArchivoFrontCoding.h"
#include <fstream>
#include <map>
#include <string>
using namespace std;

class ArchivoIndice {
private:
	EnteroLargo cantidadBloquesEscritos;
	EnteroLargo cantidadRegistrosEscritos;
	EnteroLargo tamanioBloque;
	BitStream *bs;
	ArchivoFrontCoding * archFC;
	EnteroLargo calcularOffset(int n);
	static const int TAMANIO_REGISTRO = 2;
	static const int TAMANIO_OFFSET_LEXICO=4;
	static const int TAMANIO_OFFSET_LEXICO_BITS= TAMANIO_OFFSET_LEXICO*8;
	EntradaIndice leerEntradaCabecera(int n);
	EntradaIndice leerEntradaSimple();
public:
	//constructor con solamente el openmode, toma las rutas de la config por defecto.
	ArchivoIndice(fstream::openmode mode);
	//constructor con todas las rutas
	ArchivoIndice(FileName, FileName, FileName, fstream::openmode);
	//constructor con una ruta (se crean todos en la misma)
	ArchivoIndice(FileName,FileName, fstream::openmode);
	//escribe un termino por completo en los archivos que corresponde.
	void escribir(Termino&);
	Cabecera leerCabeceraBloque(int n);
	map<string, Termino*> * leerTerminosBloque(Cabecera);
	void close();
	virtual ~ArchivoIndice();
};

#endif /* ARCHIVOINDICE_H_ */
